/**
 * @file   bitmap.h
 * @author Wang Heyu <hywang@lemur>
 * @date   Thu Jun 30 22:46:04 2022
 * 
 * @brief 演示如何读写 Windows Bitmap 图片的教学示范程序. 完全不具备应
 * 用价值, 请勿用于任何商业, 公共事业用途, 否则后果自负.
 * 
 * 
 */


#ifndef __CRAZYFISH_BITMAP__
#define __CRAZYFISH_BITMAP__

#include <string>

typedef unsigned char BYTE;		
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef int LONG;

/**
 * Bitmap 文件头.
 * 
 */
typedef struct tagBITMAPFILEHEADER
{
  WORD  bfType;			   /**< 文件类型, 永远是"BM". */
  DWORD bfSize;			   /**< 文件大小, 字节为单位. */
  WORD  bfReserved1;		   /**< 保留位, 永远是 0. */
  WORD  bfReserved2;               /**< 保留位, 永远是 0. */
  DWORD bfOffBits;		   /**< 图像数据偏移位, 从文件最初位置开始, 单位字节. */
} __attribute__((packed)) BITMAPFILEHEADER;

/**
 * Bitmap 文件信息头, 
 * 
 */
typedef struct tagBITMAPINFOHEADER
{
  DWORD        biSize;			/**< 信息头(本结构)的大小, 单位字节. */
  LONG         biWidth;			/**< 图像的宽度, 单位像素点. */
  LONG         biHeight;		/**< 图像的高度, 单位像素点. */
  WORD         biPlanes;		/**< 图层数, 永远是1. */
  WORD         biBitCount;		/**< 图像颜色的字节数, 24 表示真彩色. */
  DWORD        biCompression;	        /**< 压缩格式, 0表示不压缩. */
  DWORD        biSizeImage;		/**< 图像尺寸, 单位字节. */
  LONG         biXPelsPerMeter;	        /**< X 方向的像素密度. */
  LONG         biYPelsPerMeter;	        /**< Y 方向的像素密度. */
  DWORD        biClrUsed;		/**< 使用的颜色数, 真彩色标0. */
  DWORD        biClrImportant;	        /**< 重要颜色数, 一般标0. */
} __attribute__((packed)) BITMAPINFOHEADER;

typedef struct {
  DWORD        bV5Size;
  LONG         bV5Width;
  LONG         bV5Height;
  WORD         bV5Planes;
  WORD         bV5BitCount;
  DWORD        bV5Compression;
  DWORD        bV5SizeImage;
  LONG         bV5XPelsPerMeter;
  LONG         bV5YPelsPerMeter;
  DWORD        bV5ClrUsed;
  DWORD        bV5ClrImportant;
  DWORD        bV5RedMask;
  DWORD        bV5GreenMask;
  DWORD        bV5BlueMask;
  DWORD        bV5AlphaMask;
  DWORD        bV5CSType;
	//  CIEXYZTRIPLE bV5Endpoints;
  DWORD        bV5GammaRed;
  DWORD        bV5GammaGreen;
  DWORD        bV5GammaBlue;
  DWORD        bV5Intent;
  DWORD        bV5ProfileData;
  DWORD        bV5ProfileSize;
  DWORD        bV5Reserved;
} __attribute__((packed)) BITMAPV5HEADER;

/** 
 * 构建一个 bmp 文件.
 * 
 * @param _file 生成的文件名.
 * @param _w 图像宽度, 单位像素.
 * @param _h 图像高度, 单位像素.
 * @param _image 图像数据, 单位字节.
 */
void build_bmp(std::string _file,
	       int _w,
	       int _h,
	       char *_image);


#else

/// Do nothing.

#endif
